class MyPromise {
  // 三种状态
  static pending = '待定的'
  static fulfiled = '成功的'
  static rejected = '失败的'
  constructor(fun) {
    // 初始化待定状态
    this.status = MyPromise.pending
    // 保存值
    this.result = null

    // 保存成功状态的异步回调函数
    this.resolveCallbacks = []
    // 保存失败状态的异步回调函数
    this.rejectCallbacks = []

    try {
      fun(this.reslove.bind(this), this.reject.bind(this))
    } catch (error) {
      this.reject(error.message)
    }
  }
  // 成功时调用的方法
  reslove(result) {
    setTimeout(() => {
      if (this.status === MyPromise.pending) {
        // 改变状态
        this.status = MyPromise.fulfiled
        this.result = result

        // 执行成功状态下的异步回调函数
        this.resolveCallbacks.forEach(callback => {
          callback(this.result)
        })
      }
    })
  }

  // 失败时调用的方法
  reject(error) {
    setTimeout(() => {
      if (this.status === MyPromise.pending) {
        // 改变状态
        this.status = MyPromise.rejected
        this.result = error

        // 执行失败状态的下的异步回调函数
        this.rejectCallbacks.forEach(callback => {
          callback(error)
        })
      }
    })
  }

  // then方法,可以接收两个回调函数
  then(onFulfiled, onRejected) {
    return new MyPromise((resolve, reject) => {
      //   then后 如果传递过来的不是函数，重新赋值为空函数
      onFulfiled = typeof onFulfiled === 'function' ? onFulfiled : () => {}
      onRejected = typeof onRejected === 'function' ? onRejected : () => {}

      // 待定状态的回调函数保存到 回调函数数组中
      if (this.status === MyPromise.pending) {
        this.resolveCallbacks.push(onFulfiled)
        this.rejectCallbacks.push(onRejected)
      }

      // 成功的状态的回调函数
      if (this.status === MyPromise.fulfiled) {
        setTimeout(() => {
          onFulfiled(this.result)
        })
      }

      // 失败状态的回调函数
      if (this.status === MyPromise.rejected) {
        setTimeout(() => {
          onRejected(this.result)
        })
      }
    })
  }
}

console.log('第1步')
let myPromise = new MyPromise((resolve, reject) => {
  // reject('网络请求出错了')
  console.log('第2步')
  setTimeout(() => {
    resolve('手写基本的Promise')
    reject('失败的回调')
    console.log('第4步')
  })

  // 抛出异常
  // throw new Error('出错了')
})

myPromise
  .then(res => {
    return res
  })
  .then(
    res => console.log(res),
    error => console.log(error)
  )
console.log('第3步')
